package com.atguigu.writable2;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/*
    在该类中去实现ReduceTask中需要实现的业务逻辑代码
     Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
        两组：
            KEYIN ：读取的Key的类型（Mapper写出的key的类型）
            VALUEIN ：读取的value的类型（Mapper写出的value的类型）

            KEYOUT：写出的key的类型（在这是手机号的类型）
            VALUEOUT：写出的value的类型（在这是FlowBean）

 */
public class FlowReducer extends Reducer<Text,FlowBean,Text,FlowBean> {
    //封装的value
    private FlowBean outValue = new FlowBean();
    /**
     * 在该方法中去实现ReduceTask中需要实现的业务逻辑代码
     * 该方法在被循环调用每调用一次传入一组数据
     * @param key 读取的key -- 手机号
     * @param values 读取的所有的value --- 流量
     * @param context 上下文（在这用来将数据写出去）
     * @throws IOException
     * @throws InterruptedException
     *
     * 1532121212       10 20 30
     * 1532121212       20 30 50      ========>      1532121212   30 50 80
     *
     */
    @Override
    protected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException {
        long sumUpFlow = 0; //总上行流量
        long sumDownFlow = 0; //总下行流量
        //遍历所有的value
        for (FlowBean value : values) {
            sumUpFlow += value.getUpFlow();
            sumDownFlow += value.getDownFlow();
        }
        //封装key,value
        //给value赋值
        outValue.setUpFlow(sumUpFlow);
        outValue.setDownFlow(sumDownFlow);
        outValue.setSumFlow(outValue.getUpFlow() + outValue.getDownFlow());
        //将key,value写出去
        context.write(key,outValue);
    }
}
